/*
  进制友谊赛
  题目描述
    在一个遥远的星球上，有一个神奇的数字世界。
    这个星球上的居民都是由数字组成的生物，他们使用不同的进制来表达和交流。
    在这个数字世界中，有四个主要的数字种族：
      十进制族、二进制族、八进制族和十六进制族。
    每个族群都有自己独特的特点和文化。
      十进制族是最主流的一群，他们喜欢使用基于 10 的进制来表达数字。他们的城市充满了各种数学建筑和繁忙的计算中心。
      二进制族是计算机和技术方面的专家。他们喜欢使用基于 2 的进制，他们的居所是由 0 和 1 组成的二进制编码构建的。
      八进制族生活在一个神秘而美丽的森林中。他们喜欢使用基于 8 的进制。他们把数字编码成树叶的形状，每个树叶上的凹凸都代表一个数字。
      十六进制族是艺术和设计的专家。他们喜欢使用基于 16 的进制。他们的城市充满了五彩斑斓的建筑和华丽的艺术品。

    这一天从其他星球迁移过来一个新的民族四进制，要想加入数字世界不是那么简单，
    要求各自民族选出一个自认为最强的人，展开友谊赛（一对四单挑），
    如果四进制代表最终能够挤进前三，就欢迎加入，否则另寻去处。
    注意，并列第三也算通过，谁让数字世界的居民这么善良呢~
  输入格式
    输入五个数字 Q,D,B,O,H，分别代表四进制、十进制、二进制、八进制、十六进制民族派出来的子民。
  输出格式
    输出两行。
    第一行输出“Welcome!”表示能加入，或者“Sorry.”表示不能加入。
    第二行从大到小输出友谊赛的排名结果，数据间以单个空格隔开。注意如果值相同，则按输入顺序排序。
  样例
    输入1
      33333
      999
      10101010101
      7777
      ABC
    输出1
      Sorry.
      7777 ABC 10101010101 33333 999
    输入2
      31320
      888
      1101111000
      1570
      378
    输出2
      Welcome!
      31320 888 1101111000 1570 378
    输入3
      20
      10
      1000
      10
      10
    输出3
      Welcome!
      10 10 20 1000 10
  数据范围
    数据保证 Q,D,B,O,H 对应的十进制范围均在 0 ~ 2147483647 之间。
    并且十六进制下的 10、11、12...依次用大写字母 A、B、C 表示。
*/

#include <bits/stdc++.h>

using namespace std;

// 该函数返回 "将 m 进制数(字符串 n)转换成 10 进制数" 后得到的整形值
long long f(string n, int m) {
  long long x = 0;
  int s = 0;

  for (int i = n.size() - 1; i >= 0; i--) {
    if (n[i] >= 'A' && n[i] <= 'Z') { // 注意: 本题中输入参数中不会出现小写字母
      int a1 = n[i] - 'A' + 10;
      x = x + a1 * pow(m, s);
      s++;
    } else {
      int a1 = n[i] - '0';
      x = x + a1 * pow(m, s);
      s++;
    }
  }

  return x;
}

struct sta
{
  string name;  // 字符串 (表示 m 进制数)
  long long n1; // 10 进制值
} a[5];

bool cmp (sta a, sta b) {
  // 按照 10 进制值从大到小的顺序进行排序; 如果 2 个值相同, 则按照输入顺序进行排序!
  return a.n1 > b.n1;
}

/*==============================================================================
  特别注意:
  1.假设题目额外要求 "排序时如果遇到数值相同的, 则按照和输入顺序相反的顺序进行排序",
    我们可以在当前代码基础上进行如下处理:
      a). 在 struct sta 中再增加一个字段, 如 "int id;";
      b). 初始化时, 按照输入的顺序为该字段赋值, 如:
            第一个输入对应的 id 为 1,
            第二个输入对应的 id 为 2,
            ...
            (依次类推)
      c). 使用 sort() 函数进行排序时, 在对应的自定义 cmp() 函数中,
            优先按照 n1 字段按照从大到小的数序排序;
            当 2 个元素的 n1 字段相同时, 按照 id 字段按照从大到小的顺序进行排序;
    参见如下代码片段:
    (或参考 xue_er_si/c4/lesson_07_struct_and_sort/battle_10_score_ranking_02.cpp)

      struct sta
      {
        string name;  // 字符串 (表示 m 进制数)
        long long n1; // 10 进制值
        int id;       // 表示在命令行上输入的数序
      } a[5];

      bool cmp (sta a, sta b) {
        // 按照 10 进制值从大到小的顺序进行排序; 如果 2 个值相同, 则按照输入顺序进行排序!
        if (a.n1 != b.n1) {
          return a.n1 > b.n1;
        } else {
          return a.id > b.id;
        }
      }

  2.小结
    a). 当自定义 cmp() 函数中的排序条件只有 1 个时, cmp() 函数实现如下:

          bool cmp (sta a, sta b) {
            return a.n1 > b.n1;
          }

    b). 当自定义 cmp() 函数中的排序条件为 2 个或 2 个以上时, cmp() 函数的参考实现如下:
          bool cmp (sta a, sta b) {
            // 按照 10 进制值从大到小的顺序进行排序; 如果 2 个值相同, 则按照输入顺序进行排序!
            if (a.n1 != b.n1) {
              return a.n1 > b.n1;
            } else {
              return a.id > b.id;
            }
          }

    c). 请不要使用如下写法: (这种写法晦涩难理解)
          bool cmp (sta a, sta b) {
            if (a.n1 != b.n1) {
                return a.n1 > b.n1;
            } else {
                return false;
                // 注意:
                //   使用当前写法 "return false;"时, 如果 2 个值相同, 则按照输入顺序进行排序;
                //   如果这里写法改为 "return true;"，如果 2 个值相同, 则按照输入顺序相反的顺序进行排序
            }
          }
==============================================================================*/

int main() {

  cin >> a[0].name >> a[1].name >> a[2].name >> a[3].name >> a[4].name;
  a[0].n1 = f(a[0].name, 4);
  a[1].n1 = f(a[1].name, 10);
  a[2].n1 = f(a[2].name, 2);
  a[3].n1 = f(a[3].name, 8);
  a[4].n1 = f(a[4].name, 16);

  /*
    判断 a[0] 对应的 10 进制值是不是数组 a 中前三名!
    注意: 可能出现多个选手并列的情况!
   */
  int x = 0;
  if (a[0].n1 < a[1].n1) {
    x++;
  }
  if (a[0].n1 < a[2].n1) {
    x++;
  }
  if (a[0].n1 < a[3].n1) {
    x++;
  }
  if (a[0].n1 < a[4].n1) {
    x++;
  }

  if (x <= 2) {
    cout << "Welcome!" << endl;
  } else {
    cout << "Sorry." << endl;
  }

  // 使用 sort() 函数对数组 a 进行排序!
  sort(a, a + 5, cmp);

  for (int i = 0; i <= 4; i++) {
    cout << a[i].name << " " ;
  }

  return 0;
}